package com.easylinkin.linkappapi.listener;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * <p></p>
 *
 * @author TongJie
 * @since 2020/9/23 12:28
 */
public abstract class Listener {

    private static final Logger LOGGER = LoggerFactory.getLogger(Listener.class);

    /**
     * 与某个客户端的连接会话，需要通过它来给客户端发送数据
     */
    private Session session;
    /**
     * 用户id
     */
    private String userId;

    /**
     * 租户id
     */
    private String tenantId;

    public Session getSession() {
        return session;
    }

    public String getUserId() {
        return userId;
    }

    public String getTenantId() {
        return tenantId;
    }


    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public abstract void onOpen(Session session, String tenantId, String userId);

    public void init(Session session, @PathParam("tenantId") String tenantId, @PathParam("userId") String userId) {
        this.session = session;
        this.tenantId = tenantId;
        this.userId = userId;
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public abstract void onClose();

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        LOGGER.info("收到通知会话消息,message:{},用户id:{}", message, this.userId);
    }

    /**
     *
     */
    @OnError
    public void onError(Session session, Throwable error) {
        LOGGER.error("websocket session 发生错误",error);
        error.printStackTrace();
    }

    /**
     * 实现服务器主动推送
     */
    public void sendMessage(String message) {
        try {
            this.session.getBasicRemote().sendText(message);
        } catch (Exception e) {
            LOGGER.error("websocket 发送Exception,信息如下，cause", e);
        }
    }


//    /**
//     * 实现 定时向 客户端 主动推送
//     */
//    @Scheduled(cron = "0/10 * * * * ?")
//    public void sendMessageCron() {
//        for (Listener listener : webSocketSet) {
////            listener.sendMessage("easylinkin-Linkapp-定时发送消息： " + listener.userId + ",tenantId:" + listener.tenantId);
//        }
//    }

}
